
#include <stdio.h>
#include <stdlib.h>
#define NO_OK  0
#define NO_FAIL -1
typedef struct LNode
{
    int data;
    struct LNode *next;
}LNode;
int main()
{
    LNode *head=NULL;
//    head_insert(&head);
    tail_insert(&head);
    desplay(&head);
    destroy(&head);
    get_len(&head);
//    insert_data(&head,4,1);
//    delete_data(&head,3);
    desplay(&head);
    return 0;
}
//touchafa
int head_insert(LNode **head)
{
    if(head==NULL)
    {
        return NO_FAIL;
    }
    int data;
    scanf("%d",&data);
    if(data==9999)
    {
        return NO_OK;
    }
    *head=(LNode*)malloc(sizeof(LNode));
    (*head)->data=data;
    (*head)->next=NULL;
    while(1)
    {
        scanf("%d",&data);
        if(data==9999)
        {
            break;
        }
        LNode *pNode=(LNode*)malloc(sizeof(LNode));
        if(pNode==NULL)
        {
            return NO_FAIL;
        }
        pNode->data=data;
        pNode->next=*head;
        *head=pNode;
    }
    return NO_OK;

}
//bianli
int desplay(LNode **head)
{
    if(head==NULL)
    {
        return  NO_FAIL;
    }
    printf("-------desplay-------\n");
    LNode *pNode=*head;
    while(pNode!=NULL)
    {
        printf("%d\n",pNode->data);
        pNode=pNode->next;
    }
    return NO_OK;
}
//jisuanbiaochang
int get_len(LNode **head)
{
    if(head==NULL)
    {
        return  NO_FAIL;
    }
    int count=0;
    LNode *pNode=*head;
    while(pNode!=NULL)
    {
        count++;
        pNode=pNode->next;
    }
    if(pNode==NULL)
    {
        printf("%d\n",count);
    }
    return NO_OK;
}
//weichafa
int tail_insert(LNode **head)
{
    if(head==NULL)
    {
        return NO_FAIL;
    }
    int data;
    scanf("%d",&data);
    if(data==9999)
    {
        return NO_OK;
    }
    *head=(LNode*)malloc(sizeof(LNode));
    if(*head==NULL)
    {
        return NO_FAIL;
    }
    (*head)->data=data;
    (*head)->next=NULL;
    LNode *pTail=*head;
    while(1)
    {
        scanf("%d",&data);
        if(data==9999)
        {
            break;
        }
    
        LNode *pNode=(LNode*)malloc(sizeof(LNode));
        if(pNode==NULL)
        {
            return NO_FAIL;

        }
        pNode->data=data;
        pTail->next=pNode;
        pTail=pNode;
        
    }
    return NO_OK;
}
//zhonjiancharu
int insert_data(LNode **head,int data,int key)
{
    if(head==NULL)
    {
        return NO_FAIL;
    }
    LNode *pNode=*head;
    while(pNode!=NULL)
    {
        if(pNode->data==key)
        {
            LNode *p=(LNode*)malloc(sizeof(LNode));
            if(p==NULL)
            {
                return NO_FAIL;
            }
            p->data=data;
            p->next=pNode->next;
            pNode->next=p;
            return NO_OK;

        }
        pNode=pNode->next;
    }
    return NO_FAIL;
}
//shanchu
int delete_data(LNode **head,int key)
{
    if(head==NULL)
    {
        return NO_FAIL;
    }
    LNode *pNode=*head;
    LNode *p=NULL;
    while(pNode!=NULL)
    {
        if(pNode->data==key)
        {
            if(p==NULL)
                *head=pNode->next;
            else
            {
                p->next=pNode->next;
                free(pNode);
                
            }
            if(p!=NULL)
            {
                free(p);
                p=NULL;
            }
            return NO_OK;
        }
        p=pNode;
        pNode=pNode->next;
    }
    return NO_FAIL;
}
int destroy(LNode **head)
{
    if(head==NULL)
    {
        return NO_FAIL;
    }
    LNode *pNode=*head;
    while(pNode!=NULL)
    {
        LNode *p=pNode;
        pNode=pNode->next;
        if(p!=NULL)
        {
            free(p);
            p=NULL;
        }
    }
    *head=NULL;
    return NO_OK;
}